import Vue from 'vue'
import router from './router'
import store from './store'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css'// progress bar style
import { ACCESS_TOKEN ,REFRESH_TOKEN } from '@/store/mutation-types'

NProgress.configure({ showSpinner: false })

//定义白名单列表
const whiteList = ['/login', '/register', '/registerResult']

//全局前置守卫 to:即将要进入的目标 路由对象  from 当前导航正要离开的路由 next进行管道中的下一个钩子
router.beforeEach(async(to, from, next) =>{
	//开启进度条
	NProgress.start();
	//判断是否存在请求token,如果token不为空
	if(Vue.ls.get(ACCESS_TOKEN) !== null){
		//如果是跳转到登录页面
		if (to.path === '/login') {
			//清除storage
			Vue.ls.clear();
			next()
		}else{
			console.log('menuList',store.getters.menuList)
			//判断当前用户是否已经拉取完用户信息
			if(store.getters.menuList == undefined){
				//如果未拉取进行用户数据拉去
				//通过状态管理中向后台进行数据请求 GetUserInfo 在store->user下实现该方法
				store.dispatch('GetUserInfo').then(res =>{
					//menuList通过vuex进行管理,在user下面表示当前用户所拥有的菜单权限信息,可以改成permissList
					const menuList = {};
					// //遍历菜单信息加入到menuList里面以便进行动态路由的加载,此方法是通过authCode进行遍历
					for (let i = 0; i < res.responseData.menuList.length; i++) {
						//info.menuList[i].authCode 当前菜单的权限标识,因为由后台直接
						menuList[res.responseData.menuList[i].authCode] = true;
					}
					//动态添加路由 GenerateRoutes 在store->permission下实现该方法
					store.dispatch('GenerateRoutes',menuList).then(() =>{
						// 动态添加可访问路由表
						router.addRoutes(store.getters.addRouters)
						// hack方法 确保addRoutes已完成
						next({ ...to ,replace: true}); 
					})
				}).catch(() =>{
					//如果获取信息失败.进行前端登出操作跳转到登录 FrontEndLogout 在store->user下实现该方法
					store.dispatch('FrontEndLogout').then(() => {
						next({ path: '/login' });
					})
				})
			}else{
				//校验token有效性
				//校验通过进行数据请求,校验失败进行token刷新
				// store.dispatch('ValidataToken',Vue.ls.get(ACCESS_TOKEN)).then(resp =>{
				// 	console.log(resp)
					
				// }).catch(() =>{
				// 	store.dispatch('RefreshToken').then(() => {
				// 		next();
				// 	}).catch(error =>{
				// 		console.log(error)
				// 	})
				// })
				next();
			}
		}
	}else if(whiteList.indexOf(to.path) !== -1){
		//如果在免密白名单中直接进入
		next()
	}else if(Vue.ls.get(REFRESH_TOKEN) !== null){
		//执行刷新token请求
		store.dispatch('RefreshToken').then(() => {
			next()
		})
	}else{
		//先清空缓存在重定向	
		Vue.ls.clear();
		// 否则全部重定向到登录页
		next('/login'); 
		// 在hash模式下 改变手动改变hash 重定向回来 不会触发afterEach 暂时hack方案 ps：history模式下无问题，可删除该行！
		NProgress.done(); 
	}
});

//全局后置钩子
router.afterEach(() => {
	// 结束Progress
	NProgress.done(); 
});